Répartition des packages de Github

Sur base des données extraites dans github-RPackage-repository.csv (Github), dans cran-description.csv (CRAN), bioconductorsvn_description.csv (BioConductor) et r-forge_description.csv (R-Forge), nous allons regarder la répartition des packages de Github au sein des différentes communautés.


In [1]:
%matplotlib inline
from IPython.display import set_matplotlib_formats
#set_matplotlib_formats('pdf')

In [2]:
import pandas

github = pandas.DataFrame.from_csv('../data/github-RPackage-repository.csv')
cran = pandas.DataFrame.from_csv('../data/cran-description.csv', index_col=None)
bioconductor = pandas.DataFrame.from_csv('../data/bioconductorsvn_description.csv', index_col=None)
rforge = pandas.DataFrame.from_csv('../data/r-forge_description.csv', index_col=None)

Pour chacune de ces sources de données, nous allons conserver les dépendances ainsi que les auteurs et ajouter une étiquette pour la "source" de ce package (Github, CRAN, Bioconductor et R-Forge). Si un package est présent sur plusieurs sources, nous utiliserons les données prioritairement dans l'ordre suivant : Cran, Bioconductor, Github et enfin, R-Forge.

Préparation du dataset Github Il n'y a pas grand chose à faire sur ce dataset, car il a été préparé de sorte à fitter au mieux ce qui allait suivre. Il est, par contre, nécessaire de sélectionner les dépôts dits "canoniques" (ie. un seul dépôt pour chaque valeur de Package) pour respecter les index. Pour rappel, un dépôt canonique signifie que le dépôt n'est à priori pas un fork, et est le plus vieux dépôt créé parmi l'ensemble des dépôts hébergeant le même package.


In [3]:
print len(github)
github = github.query('canonical == True')
print len(github)


13176
5150

Préparation du dataset CRAN

Le dataframe cran contient toutes les données des fichiers DESCRIPTION. Il convient maintenant de ne filtrer que les éléments qui font partie du snapshot à la date qui nous intéresse. Ces informations sont présentes dans le fichier cran-snapshot.csv.


In [4]:
snapshot = pandas.DataFrame.from_csv('../data/cran-snapshot-20150319.csv', index_col=None)
cran = cran.merge(snapshot, how='inner')

In [5]:
temp = cran.drop_duplicates(('package', 'key'), take_last=True).rename(columns={'package': 'Package'})[['Package', 'key', 'value']]
cran_author = temp.query('key == "Author"').rename(columns={'value': 'Author'})[['Package', 'Author']]
cran_imports = temp.query('key == "Imports"').rename(columns={'value': 'Imports'})[['Package', 'Imports']]
cran_depends = temp.query('key == "Depends"').rename(columns={'value': 'Depends'})[['Package', 'Depends']]
_ = temp[['Package']].drop_duplicates().merge(cran_author, how='left', on='Package')
_ = _.merge(cran_imports, how='left', on='Package')
cran = _.merge(cran_depends, how='left', on='Package')

Préparation du dataset Bioconductor


In [6]:
bioconductor = bioconductor[['Package', 'Author', 'Imports', 'Depends']].copy()

Préparation du dataset R-Forge


In [7]:
rforge = rforge[['Package', 'Author', 'Imports', 'Depends']].copy()

Ajout des étiquettes sur la provenance


In [8]:
github['github'] = 1
cran['cran'] = 1
bioconductor['bioconductor'] = 1
rforge['rforge'] = 1

Nous allons maintenant regrouper les différents datasets en un seul, en se basant sur le nom du package. Comme indiqué précédemment, un ordre va être appliqué pour récupérer les informations qui sont présentes pour un même package provenant de plusieurs sources (typiquement le cas pour Github).


In [9]:
github.set_index('Package', inplace=True, verify_integrity=True)
cran.set_index('Package', inplace=True, verify_integrity=True)
bioconductor.set_index('Package', inplace=True, verify_integrity=True)
rforge.set_index('Package', inplace=True, verify_integrity=True)

packages = cran.combine_first(bioconductor).combine_first(github).combine_first(rforge)

Nous remplissons les N/A par les valeurs adéquates, et nous obtenons un joli petit dataset avec toutes les informations utiles sur la provenance. Il nous reste à ajouter une clé "Github only" pour indiquer qu'un package n'est présent que sur Github.


In [10]:
packages = packages.fillna({'Author': '', 
                            'Depends': '', 
                            'Imports': '',
                            'bioconductor': 0, 
                            'canonical': 0, 
                            'cran': 0,
                            'fork': 0, 
                            'github': 0, 
                            'owner': '', 
                            'repository': '', 
                            'rforge': 0})

In [11]:
def _f(row):
    if row['github'] == 1:
        if row['cran'] == row['rforge'] == row['bioconductor'] == 0:
            return 1
        else:
            return 0
    else:
        return 0
    
packages['Github only'] = packages.apply(_f, axis=1)

In [12]:
packages.to_csv('../data/R-Packages.csv')

Nous pouvons maintenant afficher ces informations graphiquement.


In [17]:
from matplotlib_venn import venn3
from matplotlib import pyplot as plt

github_set = set(packages.query('github == 1').index)
cran_set = set(packages.query('cran == 1').index)
bioconductor_set = set(packages.query('bioconductor == 1').index)
rforge_set = set(packages.query('rforge == 1').index)

v = venn3((github_set, cran_set, bioconductor_set), ('github', 'cran', 'bioconductor'))
v.get_patch_by_id('001').set_color('yellow')


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-17-cf5c8327c010> in <module>()
      7 rforge_set = set(packages.query('rforge == 1').index)
      8 
----> 9 v = venn3((github_set, cran_set, bioconductor_set), ('github', 'cran', 'bioconductor'), figsize=(10,10))
     10 v.get_patch_by_id('001').set_color('yellow')

TypeError: venn3() got an unexpected keyword argument 'figsize'

In [14]:
v = venn3((github_set, cran_set, rforge_set), ('github', 'cran', 'r-forge'))



In [15]:
v = venn3((github_set, bioconductor_set, rforge_set), ('github', 'bioconductor', 'r-forge'))
v.get_patch_by_id('010').set_color('yellow')



In [16]:
len(github_set.union(bioconductor_set).union(rforge_set).union(cran_set))


Out[16]:
12277